package com.wkbb.common.handler;

import com.alibaba.fastjson.JSON;
import com.wkbb.common.utils.StringUtil;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JsonTypeHandler extends BaseTypeHandler<Object> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter,
                                    JdbcType jdbcType) throws SQLException {
        String json;
        if (parameter instanceof String) {
            json = ((String) parameter);
        } else {
            json = JSON.toJSONString(parameter);
        }
        ps.setString(i, json);

    }

    /**
     * 是否json数组
     *
     * @param json json字符串
     */
    private boolean isJsonArray(String json) {
        return !StringUtil.isNullOrBlank(json) && json.startsWith("[");
    }

    /**
     * 是否json对象
     *
     * @param json json字符串
     */
    private boolean isJsonObject(String json) {
        return !StringUtil.isNullOrBlank(json) && json.startsWith("{");
    }

    @Override
    public Object getNullableResult(ResultSet rs, String columnName)
            throws SQLException {
        String json = rs.getString(columnName);

        return getJsonObject(json);
    }

    @Override
    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String json = rs.getString(columnIndex);

        return getJsonObject(json);
    }

    @Override
    public Object getNullableResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        String json = cs.getString(columnIndex);

        return getJsonObject(json);
    }

    private Object getJsonObject(String json) {
        if (isJsonArray(json)) {
            return JsonUtil.jsonToList(json, Object.class);
        } else if (isJsonObject(json)) {
            return JSON.parseObject(json, Object.class);
        } else {
            return json;
        }
    }

}
